#include "check_udisk.h"
#include  <unistd.h>

Save_Load m_save_load;

/*
在Linux中，需要查看磁盘使用情况，, statfs函数可以胜任这个任务.下面将简单介绍statfs函数及其使用。
函数如下：
int statfs(const charpath, struct statfsbuf);
参数：
path: 位于需要查询信息的文件系统的文件路径
buf: statfs结构体类型的指针变量，用于存储文件系统的相关信息

struct statfs{
    long f_type;        //文件系统的类型
    long f_bsize;       //经优化后的传输块的大小
    long f_blocks;      //文件系统数据块总数
    long f_bfree;       //可用块数
    long f_bavail;      //普通用户能够获得的块数
    long f_files;       //文件结点总数
    long f_ffree;       //可用文件结点数
    fisd_t f_fsid;      //文件系统标识
    long f_namelen;     //文件名的最大长度
}

*/

//=================================================================================================================================================
//本地存储
//=================================================================================================================================================
void localpath_select()
{
    PutIniKeyInt("Option","Savepath",0,PARAM_FILE);
    // ui->local_btn->setStyleSheet ("border-image:url(:/res/set/radio.png)");
    // ui->sd_btn->setStyleSheet    ("border-image:url(:/res/set/unradio.png)");
    // ui->usb_btn->setStyleSheet   ("border-image:url(:/res/set/unradio.png)");
}
//=================================================================================================================================================
//保存路径为SD卡
//=================================================================================================================================================
void sdpath_select()
{
    if(!file_exist(SDCARD_FILE_PIC_LOAD)) mkdirs(SDCARD_FILE_PIC_LOAD);
    if(!file_exist(SDCARD_FILE_AVI_LOAD)) mkdirs(SDCARD_FILE_AVI_LOAD);
    PutIniKeyInt("Option","Savepath",1,PARAM_FILE);
    // ui->sd_btn->setStyleSheet       ("border-image:url(:/res/set/radio.png)");
    // ui->local_btn->setStyleSheet    ("border-image:url(:/res/set/unradio.png)");
    // ui->usb_btn->setStyleSheet      ("border-image:url(:/res/set/unradio.png)");
}

//=================================================================================================================================================
//保存路径为USB
//=================================================================================================================================================
void usbpath_select()
{
    system("mkdir /udisk/video");                                   //create dir
    system("mkdir /udisk/picture");                                 //create dir
    PutIniKeyInt("Option","Savepath",2,PARAM_FILE);
    m_save_load.pic_load = UDISK_FILE_PIC_LOAD;
    m_save_load.avi_load = UDISK_FILE_AVI_LOAD;
    // ui->usb_btn->setStyleSheet      ("border-image:url(:/res/set/radio.png)");
    // ui->sd_btn->setStyleSheet       ("border-image:url(:/res/set/unradio.png)");
    // ui->local_btn->setStyleSheet    ("border-image:url(:/res/set/unradio.png)");
}

//=================================================================================================================================================
//SD卡插入检测处理
//=================================================================================================================================================
void sdsetconnect()
{
    printf("SDcard connect\n");
    if(!file_exist(SDCARD_FILE_PIC_LOAD)) mkdirs(SDCARD_FILE_PIC_LOAD);
    if(!file_exist(SDCARD_FILE_AVI_LOAD)) mkdirs(SDCARD_FILE_AVI_LOAD);
}

//=================================================================================================================================================
//SD卡断开处理
//=================================================================================================================================================
void sdsetunconnect()
{
    printf("sdcard disconnect\n");
    system("sync");
    system("umount /sdcard");
    system("rm -rf /sdcard/*");
    PutIniKeyInt("Option","Savepath",0,PARAM_FILE);
    m_save_load.pic_load = LOCAL_FILE_PIC_LOAD;
    m_save_load.avi_load = LOCAL_FILE_AVI_LOAD;
}


//=================================================================================================================================================
//  磁盘空间检测
//=================================================================================================================================================
EMMC_info check_emmc_disk(char * path)
{
    EMMC_info EMMC_info;
    double GB =1073741824.0;                                    // 2^30
    struct statfs diskInfo;
    statfs(path, &diskInfo);                                    // 设备挂载的节点
    uint64_t blocksize = diskInfo.f_bsize;                      // 每一个block里包含的字节数
    uint64_t totalsize = blocksize * diskInfo.f_blocks;         // 总的字节数，f_blocks为block的数目
    uint64_t freeDisk = diskInfo.f_bfree * blocksize;           // 剩余空间的大小
    uint64_t availableDisk = diskInfo.f_bavail * blocksize;     // 可用空间大小
    EMMC_info.total = totalsize / GB;
    EMMC_info.remain = availableDisk / GB;
    EMMC_info.free = freeDisk / GB;
    EMMC_info.used = (totalsize - availableDisk) / GB;
    return EMMC_info;
}


//=================================================================================================================================================
//U盘插入检测处理
//=================================================================================================================================================
void udisk_set_connect()
{
    int status;
    EMMC_info EMMC_video;
    EMMC_info EMMC_picture;   

//   EMMC_video      = check_emmc_disk("/video");                             //获取EMMC内视频的存储信息;
//   EMMC_picture    = check_emmc_disk("/picture");                           //获取EMMC内图片的存储信息;

    printf("usb connect\n");
    system("mkdir /udisk");
    status = system("mount -t vfat /dev/sda1 /udisk ");                      //挂载USB卡到系统目录
    printf("SYSTEM INFO:: mount USB status value = [0x%x]\n", status);
    if(status != 0)
    {
        status = system("mount -t vfat /dev/sdb1 /udisk ");                  //挂载USB卡到系统目录
        if(status != 0)
        {
           status = system("mount -t vfat /dev/sdc1 /udisk ");               //挂载USB卡到系统目录 
        }
    }
    system("sync");
//  usbpath_select();                                                       //路径切换到u盘

//  copyefile = 1;
//  system("cp -r /picture/* /udisk/picture/");                             //拷贝图片到USB
//  system("cp -r /video/* /udisk/video");                                  //拷贝视频到USB
//  printf("EMMC_INFO:: VIDEO_TOTAL   = %.1fG\n",EMMC_video.total);         //打印视频存储总空间
//  printf("EMMC_INFO:: VIDEO_FREE    = %.1fG\n",EMMC_video.free);          //打印视频存储剩余空间
//  printf("EMMC_INFO:: PICTURE_TOTAL = %.1fG\n",EMMC_picture.total);       //打印图片存储总空间
//  printf("EMMC_INFO:: PICTURE_FREE  = %.1fG\n",EMMC_picture.free);        //打印图片存储剩余空间
//  if(EMMC_picture.free < 0.2)
//      system("rm -rf /picture/*");                                        //删除EMMC内的图片
//  if(EMMC_video.free < 0.3)
//      system("rm -rf /video/*");                                          //删除EMMC内的视频
//  copyefile = 0;
    system("sync");  
}

//=================================================================================================================================================
//U盘断开处理
//=================================================================================================================================================
void udisk_set_unconnect()
{
    system("sync");
    system("umount /udisk");
    system("rm -rf /udisk/*");
    PutIniKeyInt("Option","Savepath",0,PARAM_FILE);
    m_save_load.pic_load = LOCAL_FILE_PIC_LOAD;
    m_save_load.avi_load = LOCAL_FILE_AVI_LOAD;
}

void * check_udisk(void *pArgs)
{
    printf("INFO::(0x%lx): check_udisk\n",pthread_self());     //打印线程

    struct sockaddr_nl snl;
    int hotplug_sock;
    const int buffersize = 16 * 1024 * 1024;
    memset(&snl, 0x00, sizeof(struct sockaddr_nl));
    snl.nl_family = AF_NETLINK;
    snl.nl_pid = getpid();
    snl.nl_groups = 1;
    hotplug_sock = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_KOBJECT_UEVENT);
    setsockopt(hotplug_sock, SOL_SOCKET, SO_RCVBUFFORCE, &buffersize, sizeof(buffersize));
    bind(hotplug_sock, (struct sockaddr *) &snl, sizeof(struct sockaddr_nl));
    while(1){
        char buf[4096] = {0};
        recv(hotplug_sock, &buf, sizeof(buf), 0);
        if(strstr(buf, "add@/devices/platform/soc/100f0000.himci.SD/mmc_host/mmc1/mmc1:0001/block/mmcblk1") != NULL)
            sdsetconnect();
        if(strstr(buf, "remove@/devices/platform/soc/100f0000.himci.SD/mmc_host/mmc1/mmc1:0001/block/mmcblk1")!= NULL)
            sdsetunconnect();
        if(strstr(buf, "add@/devices/platform/soc/100e0000.xhci_0/usb1/1-1/1-1:1.0/host0/target0:0:0/0:0:0:0/block/sda/sda1")!= NULL)
            udisk_set_connect();
        if(strstr(buf, "remove@/devices/platform/soc/100e0000.xhci_0/usb1/1-1/1-1:1.0/host0/target0:0:0/0:0:0:0/block/sda/sda1")!= NULL)
            udisk_set_unconnect();
    }
}
